/**
 * @description: 统一接口调用
 */
// import axios from "./redAxios.js"; //redaxios
import axios from "./axios.js";
export { axios };
// window.axios = axios;
/**
 * @description ajax请求封装
 */
export function ajax(option, config) {
  // console.error('ajax',this);
  config = config || {};
  // if (!config.cancelToken) {
  //   let getCancel = typeof config.getCancel == "function" ? config.getCancel : (cancel) => null;
  //   config.cancelToken = new axios.CancelToken(getCancel); //取消请求标识
  // }
  // config.cancelToken = config.signal;
  let axiosBaseConfig = {} || { baseURL: "api", timeout: 0 };
  let axiosIstance = axios.create(axiosBaseConfig);
  return axiosIstance({ ...option, ...config }); //.catch((error) => error);
}
ajax.axios = axios;

/**
 * @description 接口请求封装
 */
export function api(api, config) {
  if (!api) {
    return Promise.resolve({ code: 1, message: `没有http请求配置` });
  }
  let option = typeof api.packagingRequest == "function" ? api.packagingRequest(api.requestParam) : api; //请求参数封装(如果有请求参数封装函数)
  if (option.url == null) {
    return Promise.resolve({ code: 1, message: `没有请求地址url`, option, api, config });
  }
  if (!option.method) {
    return Promise.resolve({ code: 1, message: `请求类型method`, option, api, config });
  }
  return ajax(option, config)
    .catch((error = {}) => {
      //统一异常处理
      // console.warn("[ajax 请求异常]:", error);
      let message = "接口请求异常";
      let response = error.response;
      let status = (response || {}).status;
      switch (status) {
        case 400:
          message = "接口请求参数异常";
          break;
        case 401: {
          message = "接口权限不足";
          break;
        }
        case 403:
          message = "接口请求被服务器拒绝";
          break;
        case 404: {
          let responseURL = (error.request || {}).responseURL;
          message = `接口地址[${responseURL || option.url}]不存在`;
          break;
        }
        case 500:
          message = "接口服务器异常";
          break;
        default:
          message = error.message || message;
      }
      return { data: { code: 1, message, msg: message, error, option, api, config } };
    })
    .then((res) => {
      //统一响应处理,需要对请求结果进行封装则先封装请求结果
      return typeof api.packagingResponse == "function" ? api.packagingResponse(res.data) : res.data;
    });
}

//快捷api调用;使用步骤:1.首先挂载api文档对象(ajax.apiDoc=api文档对象(Object));2.调用接口ajax.$api('接口key',接口参数,额外配置)
ajax.apiDoc = null;
ajax.$api = function (key, params, config) {
  let option = findApiOption(ajax.apiDoc, key);
  // console.log("[$api]", option, ajax.apiDoc, key);
  return option ? api({ ...option, requestParam: params }, config) : Promise.resolve({ code: 1, message: `[${key}]没有接口配置` });
};

/**
 * @description 根据key递归查找api
 */
export function findApiOption(obj, key) {
  if (!obj || !key) {
    return null;
  }
  if (obj[key]) {
    return obj[key];
  } else {
    let keys = key.split(".") || [];
    return findApiOption(obj[keys.shift()], keys.join("."));
  }
}

// export default {

//   install: (app, apiDoc) => {
//     // console.log("[install api]", app, apiDoc, this);
//     // app.config.globalProperties.$apiDoc = apiDoc;
//     //实现统一接口调用函数并挂载为全局接口调用函数
//     // app.config.globalProperties.$api = function (apiKey, apiParam, apiConfig) {
//     //   // console.log("[api调用]", apiKey, apiParam, apiConfig, this);
//     //   let api = findApiOption(this.$apiDoc, apiKey); //查找api配置
//     //   if (!api) {
//     //     this.$msg && this.$msg(`接口[${apiKey}]没有http请求配置`, "error");
//     //     return Promise.resolve({ code: 0, message: `接口[${apiKey}]没有http请求配置` });
//     //   }
//     //   let ajaxOption = api && api.packagingRequest ? api.packagingRequest(apiParam) : api; //请求参数封装(如果有请求参数封装函数)
//     //   if (process.env.NODE_ENV === "development") {
//     //     ajaxOption = { ...api, ...ajaxOption };
//     //   }
//     //   if (ajaxOption.url == null) {
//     //     return Promise.resolve({ code: 0, message: `接口[${apiKey}]没有请求地址url` });
//     //   }
//     //   if (!ajaxOption.method) {
//     //     return Promise.resolve({ code: 0, message: `接口[${apiKey}]没有请求类型method` });
//     //   }

//     //   return ajax(ajaxOption, apiConfig)
//     //     .then((res) => {
//     //       //统一响应处理,需要对请求结果进行封装则先封装请求结果
//     //       return typeof api.packagingResponse == "function"
//     //         ? api.packagingResponse(res.data)
//     //         : res.data;
//     //     })
//     //     .catch((error = {}) => {
//     //       //统一异常处理
//     //       console.warn("[ajax 请求异常]:", error);
//     //       let message = "接口请求异常";
//     //       let response = error.response;
//     //       let status = (response || {}).status;
//     //       switch (status) {
//     //         case 400:
//     //           message = "接口请求参数异常";
//     //           break;
//     //         case 401: {
//     //           message = "接口权限不足";
//     //           let data = response ? response.data || {} : {};
//     //           if (data.code == 4010) {
//     //             //处理用户未登陆和登陆过期
//     //             message = "登录过期，请重新登录";
//     //             this.$setSession && this.$setSession(null);
//     //           } else if (data.code == 303 && data.url) {
//     //             //处理后端重定向
//     //             message = "权限不足";
//     //             let origin = location.origin;
//     //             let errorMsg = encodeURIComponent(JSON.stringify(data.data));
//     //             location.href = `${origin}${data.url}?errorMsg=${errorMsg}`;
//     //           }
//     //           break;
//     //         }
//     //         case 403:
//     //           message = "接口请求被服务器拒绝";
//     //           break;
//     //         case 404: {
//     //           let responseURL = (error.request || {}).responseURL;
//     //           message = `接口地址[${responseURL || ajaxOption.url}]不存在`;
//     //           break;
//     //         }
//     //         case 500:
//     //           message = "接口服务器异常";
//     //           break;
//     //         default:
//     //           message = error.message || "接口请求异常";
//     //       }
//     //       return { code: 1, message, error };
//     //     });
//     // };
//     // app.config.globalProperties.$ajax = ajax; //挂载全局函数
//   }
// };
